package com.bestcem.xm.award.service;

import com.bestcem.xm.award.controller.param.point.PointAwardWinListParam;
import com.bestcem.xm.award.entity.pojo.AwardAwardDO;
import com.bestcem.xm.award.entity.pojo.AwardPointRecordDO;
import com.bestcem.xm.award.entity.pojo.AwardRequestDO;
import com.bestcem.xm.award.service.bo.point.BandPointDrawBO;
import com.bestcem.xm.award.service.bo.point.PointAwardStatisBO;
import com.bestcem.xm.award.service.bo.point.PointAwardWinListBO;
import com.bestcem.xm.award.service.dto.DeliverRpcDTO;
import com.bestcem.xm.award.service.dto.FileInfoDTO;
import com.bestcem.xm.common.core.domain.web.ServiceResult;

/**
 * 积分奖励领取，以及领取记录查询统计
 *
 * @author xa.zhang <xa.zhang@idiaoyan.com>
 * @version v1.0
 * @date 2021/8/30 17:46
 */
public interface PointAwardDrawService {

    /**
     * 领取积分奖励
     *
     * @param requestId request表的id
     * @param awardId   award表的id
     * @param phone     手机号
     * @return 红包金额
     */
    ServiceResult<BandPointDrawBO> drawPointAward(String requestId, String awardId, String phone);

    /**
     * 统计
     *
     * @param id 奖励id
     * @return 统计结果
     */
    ServiceResult<PointAwardStatisBO> stats(String id);

    /**
     * 查询列表
     *
     * @param param 条件
     * @return 结果
     */
    ServiceResult<PointAwardWinListBO> lists(PointAwardWinListParam param);

    /**
     * 导出
     *
     * @param param 条件
     * @return 结果
     */
    ServiceResult<FileInfoDTO> export(PointAwardWinListParam param);

    /**
     * 创建默认实体
     *
     * @param deliver      投放信息
     * @param awardRequestDO 请求信息
     * @param award        奖励信息
     * @return 待插入积分奖励记录
     */
    AwardPointRecordDO createPointAwardEntity(DeliverRpcDTO deliver, AwardRequestDO awardRequestDO, AwardAwardDO award);

    /**
     * 达到次数或者答卷时间短等，插入“未发奖”记录
     *
     * @param awardRequestDO 请求信息
     * @param award        奖励信息
     * @param errorMsg     错误信息
     * @return 结果
     */
    ServiceResult insertFailRecord(AwardRequestDO awardRequestDO, AwardAwardDO award, String errorMsg);

    /**
     * 检查剩余次数
     *
     * @param award 奖励信息
     * @return true还可领，false不可领取
     */
    boolean checkWaitCount(AwardAwardDO award);


}
